import pyautogui


class Pyautogui_Option:
    def __init__(self):
        pyautogui.FAILSAFE = True  # 默认是True,表示启动防故障功能,左上角的坐标为（0，0），将鼠标移到屏幕的左上角，来抛出failSafeException异常

    # 全局暂停
    def pause_global(self, time_s: int = 1):
        """
        全局暂停
        :param time_s: 秒数
        :return:
        """
        pyautogui.PAUSE = time_s
        return True

    # 临时休眠
    def temporary_sleep(self, time_s: int = 1):
        """
        临时休眠
        :param time_s: 休眠时间，秒
        :return:
        """
        pyautogui.sleep(time_s)
        return True

    # 倒计时
    def count_down(self, time_s: int = 5):
        """
        倒计时
        :param time_s: 时间，秒
        :return:
        """
        pyautogui.countdown(time_s)
        return True

    # 获取屏幕的宽度和高度
    def get_screen_size(self):
        """
        获取屏幕的宽度和高度
        :return: width, height
        """
        return pyautogui.size()

    # 获取像素
    def get_screen_pixel(self, x: int, y: int):
        """
        获取像素
        :param x: x坐标
        :param y: y坐标
        :return: 元组
        """
        return pyautogui.pixel(x, y)

    # 判断(x,y)是否在屏幕上
    def is_xy_onscreen(self, x: int, y: int):
        """
        判断(x,y)是否在屏幕上
        :param x: x坐标
        :param y: y坐标
        :return: 布尔值
        """
        return pyautogui.onScreen(x, y)

    # 获取当前鼠标坐标
    def get_mouse_xy(self):
        """
        获取当前鼠标坐标
        :return: x,y
        """
        return pyautogui.position()

    # 控制鼠标移动坐标
    def move_mouse_xy(self, x: int = None, y: int = None, duration: float = 0.2, move_mode: int = 1):
        """
        控制鼠标移动坐标
        :param x: x坐标
        :param y: y坐标
        :param duration: 持续时间
        :param move_mode: 移动模式，1绝对，2,相对
        :return:
        """
        if move_mode == 1:
            return pyautogui.moveTo(x, y, duration)
        else:
            return pyautogui.moveRel(x, y, duration)

    # 点击鼠标
    def click_mouse(self, button="left", click_mode: int = 1):
        """
        点击鼠标
        :param button:left,right,middle
        :param click_mode:1单击、2双击、3三连击，其他，不操作
        :return:
        """
        pyautogui.sleep(0.5)
        if click_mode == 1:
            return pyautogui.click(button=button)
        elif click_mode == 2:
            return pyautogui.doubleClick(button=button)
        elif click_mode == 3:
            return pyautogui.tripleClick(button=button)
        else:
            pass

    # 按住鼠标
    def mouse_down(self, button='left'):
        """
        按住鼠标
        :button:鼠标按键，默认左键
        :return:
        """
        return pyautogui.mouseDown(button=button)

    # 松开鼠标
    def mouse_up(self, button='left'):
        """
        松开鼠标
        :param button:鼠标按键，默认左键
        :return:
        """
        return pyautogui.mouseUp(button=button)

    # 拖动鼠标
    def drag_mouse_xy(self, x: int = None, y: int = None, duration: float = 0.2, drag_mode=1, button="left"):
        """
        拖动鼠标
        :param x:x坐标
        :param y:y坐标
        :param duration: 持续时间
        :param drag_mode:拖动模式。1绝对，2相对。
        :param button:鼠标按键，默认左键
        :return:
        """
        if drag_mode == 1:
            return pyautogui.dragTo(x, y, duration, button=button)
        else:
            return pyautogui.dragRel(x, y, duration, button=button)

    # 控制鼠标滚轮的滚动
    def scroll_mouse(self, num: int = 100):
        """
        控制鼠标滚轮的滚动
        正整数表示向上滚动， 传递负整数表示向下滚动。
        :param num: 滚动格数
        :return:
        """
        return pyautogui.scroll(num)

    # 输入字符
    def input_write(self, text, interval: float = 0.25):
        """
        输入字符
        :param text: 输入的文本
        :param interval: 间隔时间
        :return: 
        """
        return pyautogui.write(text, interval=interval)
        # return pyautogui.typewrite(text, interval=interval)

    # 单个键盘控制
    def single_keybord_press(self, key_name, count: int = 1):
        """
        单个键盘控制
        :param press_keybord: 按键名称
        :param count: 按的次数
        :return:
        """
        return pyautogui.press(key_name, count)

    # 组合键盘控制
    def multi_keybord_press(self, *args):
        """
        组合键盘控制
        :param kwargs: 组合键名称
        :return:
        """
        return pyautogui.hotkey(args)

    # 列出按键名
    def list_keybord_name(self):
        """
        列出按键名
        :return:
        """
        return pyautogui.KEY_NAMES

    # 按下键盘某个键，但不松开
    def keybord_down(self, keyname):
        """
        按下键盘某个键，但不松开
        :param keyname: 按键名称
        :return:
        """
        return pyautogui.keyDown(keyname)

    # 松开键盘某个键
    def keybord_up(self, keyname):
        """
        松开键盘某个键
        :param keyname: 按键名称
        :return:
        """
        return pyautogui.keyUp(keyname)

    # 截图控制
    def screen_shot(self, file_path, shot: tuple = None):
        """
        截图控制
        :param file_path: 保存截图文件
        :param shot: 如果为None，全屏截图，如果为(0,0,100,100),区域截图
        :return:
        """
        if shot is None:
            return pyautogui.screenshot(file_path)
        else:
            return pyautogui.screenshot(file_path, shot)

    # 图像定位
    def screen_location(self, file_path):
        """
        图像定位
        locateOnScreen()函数返回， 是屏幕上首次发现该图像时左边的x坐标、 顶边的y坐标、 宽度以及高度。

        例如：事先截取了图像，比如屏幕左下角的 window 图片，保存为submit.png， 那么locateOnScreen('submit.png')函数将返回图像所在处的坐标。
        :param file_path:要找的图像的路径
        :return:
        """
        return pyautogui.locateOnScreen(file_path)

    '''窗口获取与操作'''

    # 获取活动窗口
    def get_active_windows(self):
        return pyautogui.getActiveWindow()
